// Prevents additional console window on Windows in release, DO NOT REMOVE!!
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]

// 在Android环境中启用日志捕获
#[cfg(target_os = "android")]
mod android_log {
    use std::ffi::CString;
    
    // 定义Android日志级别常量
    const ANDROID_LOG_DEBUG: i32 = 3;
    const ANDROID_LOG_INFO: i32 = 4;
    const ANDROID_LOG_ERROR: i32 = 6;
    
    // 声明Android日志函数
    #[link(name = "log")]
    extern "C" {
        fn __android_log_write(prio: i32, tag: *const std::os::raw::c_char, text: *const std::os::raw::c_char) -> i32;
    }
    
    // 安全的Android日志写入函数
    pub fn android_log(prio: i32, tag: &str, text: &str) {
        unsafe {
            let tag_c = CString::new(tag).unwrap();
            let text_c = CString::new(text).unwrap();
            __android_log_write(prio, tag_c.as_ptr(), text_c.as_ptr());
        }
    }
    
    pub fn debug(tag: &str, text: &str) {
        android_log(ANDROID_LOG_DEBUG, tag, text);
    }
    
    pub fn info(tag: &str, text: &str) {
        android_log(ANDROID_LOG_INFO, tag, text);
    }
    
    pub fn error(tag: &str, text: &str) {
        android_log(ANDROID_LOG_ERROR, tag, text);
    }
}

use parking_lot::Mutex;
use std::path::PathBuf;

// 导入前端接口处理器模块
mod handlers;
// 导入数据库操作日志切面模块
mod db_logger;

// 应用状态模块
mod app_state;

// 重新导出app_state模块中的所有内容，以便其他模块可以通过crate::app_state访问
pub use app_state::*;

// AppState的实现已经移到app_state.rs文件中

// 需要支持移动端
#[tauri::mobile_entry_point]
#[cfg(any(target_os = "android", target_os = "ios"))]
fn main() {
    run()
}

#[cfg(not(any(target_os = "android", target_os = "ios")))]
fn main() {
    run()
}


fn run() {
    let context = tauri::generate_context!();
    
    // 使用标准库创建基本的数据目录
    let app = tauri::Builder::default();
    let data_dir = {
        let mut path = std::env::current_dir().expect("无法获取当前目录");
        path.push("data");
        path
    };
    
    // 确保数据目录存在
    if let Err(e) = std::fs::create_dir_all(&data_dir) {
        eprintln!("创建数据目录失败: {}", e);
    }
    
    // 创建uploads目录用于存储上传的文件 - 放在data目录下
    let mut uploads_dir = data_dir.clone();
    uploads_dir.push("uploads");
    if let Err(e) = std::fs::create_dir_all(&uploads_dir) {
        eprintln!("创建上传目录失败: {}", e);
    }

    // 安全地创建AppState
    let state = match AppState::new(data_dir) {
        Ok(state) => {
            #[cfg(target_os = "android")]
            android_log::info("TauriApp", "应用状态创建成功");
            println!("[RUST] 应用状态创建成功");
            Mutex::new(state)
        },
        Err(e) => {
            let error_msg = format!("创建应用状态失败: {}", e);
            #[cfg(target_os = "android")]
            android_log::error("TauriApp", &error_msg);
            eprintln!("[RUST ERROR] {}", error_msg);
            // 返回一个基本状态以避免崩溃
            let fallback_dir = std::path::PathBuf::from(".");
            let fallback_state = AppState::new_with_fallback(fallback_dir);
            Mutex::new(fallback_state)
        }
    };
    
    // 安全地设置环境变量
    if let Some(dir_str) = uploads_dir.to_str() {
        std::env::set_var("UPLOADS_DIR", dir_str);
    }

    // 构建应用
    #[cfg(target_os = "android")]
    android_log::info("TauriApp", "应用配置完成，准备启动");
    
    let app_builder = app
        .manage(state)
        // 使用handlers模块中的register_handlers函数注册所有接口
        .invoke_handler(handlers::register_handlers());
    
    #[cfg(target_os = "android")]
    android_log::info("TauriApp", "应用准备运行");
    println!("[RUST] 应用准备运行");
    
    match app_builder.run(context) {
        Ok(_) => {
            #[cfg(target_os = "android")]
            android_log::info("TauriApp", "应用正常退出");
        },
        Err(e) => {
            let error_msg = format!("运行应用失败: {}", e);
            #[cfg(target_os = "android")]
            android_log::error("TauriApp", &error_msg);
            eprintln!("[RUST ERROR] {}", error_msg);
        }
    }
}